home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / mxcode / soundx / dmalib.doc < prev    next >
Text File  |  1993-06-27  |  4KB  |  110 lines

  1.  
  2.    Copyright 1993 by Peter Sprenger   Pete@amber.dinoco.de
  3.                      Muenchener Str.6
  4.                      50170 Kerpen
  5.                      Germany
  6.  
  7.    Permission to use, copy, modify, and distribute this
  8.    software and its documentation for any purpose and without
  9.    fee is hereby granted, provided that the above copyright
  10.    notice appear in all copies.  The author Peter Sprenger
  11.    makes no representations about the suitability of this
  12.    software for any purpose.  It is provided "as is" without
  13.    express or implied warranty.
  14.  
  15.  
  16.  
  17. What is dmalib? Dmalib is an easy interface to initiate dma
  18. transfers. Since one dma transfer can only occur in one dma
  19. page, a big dma transfer has to be devided in a series of
  20. subtransfers. When you use dmalib, it will initiate a transfer
  21. up to the end of the used dma page. After the end of this transfer
  22. (on most devices like soundcards there occurs an interrupt), you have
  23. to call dma_next(). This routine will then initiate the next
  24. subtransfer. After the end of this subtransfer you have to call
  25. dma_next(), and so on...
  26.  
  27. The function dma_len() gives you the remaining bytes, that are to
  28. transfer in subtransfers until the whole dma transfer is completed.
  29. When this function gives you a value of zero, there is no need for
  30. further calling of dma_next(). It will indicate the completion of the
  31. whole dma transfer. The function dma_len() will show only correct
  32. values BEFORE a subtransfer (before calling dma_next()).
  33.  
  34.  
  35.  
  36.  
  37. --------------------  Documentation  ----------------------------
  38.  
  39.  
  40.  
  41.  
  42. WORD dma_set(DWORD adr,DWORD len,int channel,BYTE mode);
  43.  
  44.   The procedure dma_set() is used to initiate a big dma transfer. With
  45.   "big" a dma transfer that crosses dma pages is meant. The first
  46.   argument is the address where to start the dma transfer. The address
  47.   is the memory address as an unsigned long word. You can use values in
  48.   the range from 0 to 16mbyte (24 bits are used). The address is NOT in
  49.   segment representation (of course far ptr can only point up to 1mbyte).
  50.   The 2nd argument is the length of the dma transfer. The 3rd is the
  51.   dma channel number. The channel number is valid in the range 0 - 7.
  52.   The last argument specifies the dma mode. It is a combination of the
  53.   following:
  54.  
  55.  
  56.   [DMA_SINGLE | DMA_BLOCK | DMA_DEMAND] [DAM_IN|DMA_OUT] [DMA_AUTO] [DMA_DECREMENT]
  57.  
  58.   An example for dma single transfer, out of ram and with auto
  59.   initializing:
  60.  
  61. WORD dma_set(0x8000,0x1000,1,DMA_SINGLE|DMA_OUT|DMA_AUTO);
  62.  
  63.   The return value of dma_set() are the number of bytes that will
  64.   transferred in this subtransfer. For sound blaster programming for
  65.   example, you have to feed the DSP with this value.
  66.   
  67.   WARNING: The dma channels over 3 are 16 bit channel (in an AT only).
  68.   Dma_set() will divide address and length through 2. So you can use
  69.   only EVEN addresses and an EVEN length on 16 bit channels. But this
  70.   enables you to access the range from 0 to 32mbyte and to make
  71.   128kbyte transfer (so say my docs - no warranty!).
  72.  
  73.  
  74.  
  75. WORD dma_next(int channel);
  76.  
  77.   Just call dma_next() with the dma channel number, and the subtransfer
  78.   is intiated. The return value is like dma_set() the number of bytes
  79.   that will be transferred in the next subtransfer.
  80.   
  81.  
  82.  
  83.   DWORD far2long(char far *adr);
  84.   
  85.   The function far2long takes a segmented far (or huge) pointer and
  86.   returns a 32 bit address, that can be used for dma_set().
  87.   
  88.  
  89.  
  90. long dma_len(int channel);
  91.  
  92.   This function gives you the number of bytes that are to transfer to
  93.   complete the whole dma transfer. The normal purpose of dma_len is the
  94.   calling to determine if there are subsequent calls of dma_next()
  95.   needed.
  96.  
  97.  
  98.  
  99.  
  100. -----------------------------------------------------------
  101.  
  102.  
  103.  
  104. Vers.                          History
  105.                                -------
  106.  
  107.  1.00 20-Jun-93  dmalib 1.0 library released
  108.  
  109.  
  110.